home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 July & August / PCWorld_2006-07-08_cd.bin / komunikace / apache / apache_2[1].2.2-win32-x86-no_ssl.msi / Data1.cab / _AFC91D5F0FBBD086C4DCC439F04C3C39 < prev    next >
Text File  |  2005-02-04  |  5KB  |  129 lines

  1. /* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
  2.  * applicable.
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *
  8.  *     http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16.  
  17. /**
  18.  * @file apr_anylock.h
  19.  * @brief APR-Util transparent any lock flavor wrapper
  20.  */
  21. #ifndef APR_ANYLOCK_H
  22. #define APR_ANYLOCK_H
  23.  
  24. #include "apr_proc_mutex.h"
  25. #include "apr_thread_mutex.h"
  26. #include "apr_thread_rwlock.h"
  27.  
  28. /** Structure that may contain any APR lock type */
  29. typedef struct apr_anylock_t {
  30.     /** Indicates what type of lock is in lock */
  31.     enum tm_lock {
  32.         apr_anylock_none,           /**< None */
  33.         apr_anylock_procmutex,      /**< Process-based */
  34.         apr_anylock_threadmutex,    /**< Thread-based */
  35.         apr_anylock_readlock,       /**< Read lock */
  36.         apr_anylock_writelock       /**< Write lock */
  37.     } type;
  38.     /** Union of all possible APR locks */
  39.     union apr_anylock_u_t {
  40.         apr_proc_mutex_t *pm;       /**< Process mutex */
  41. #if APR_HAS_THREADS
  42.         apr_thread_mutex_t *tm;     /**< Thread mutex */
  43.         apr_thread_rwlock_t *rw;    /**< Read-write lock */
  44. #endif
  45.     } lock;
  46. } apr_anylock_t;
  47.  
  48. #if APR_HAS_THREADS
  49.  
  50. /** Lock an apr_anylock_t structure */
  51. #define APR_ANYLOCK_LOCK(lck)                \
  52.     (((lck)->type == apr_anylock_none)         \
  53.       ? APR_SUCCESS                              \
  54.       : (((lck)->type == apr_anylock_threadmutex)  \
  55.           ? apr_thread_mutex_lock((lck)->lock.tm)    \
  56.           : (((lck)->type == apr_anylock_procmutex)    \
  57.               ? apr_proc_mutex_lock((lck)->lock.pm)      \
  58.               : (((lck)->type == apr_anylock_readlock)     \
  59.                   ? apr_thread_rwlock_rdlock((lck)->lock.rw) \
  60.                   : (((lck)->type == apr_anylock_writelock)    \
  61.                       ? apr_thread_rwlock_wrlock((lck)->lock.rw) \
  62.                       : APR_EINVAL)))))
  63.  
  64. #else /* APR_HAS_THREADS */
  65.  
  66. #define APR_ANYLOCK_LOCK(lck)                \
  67.     (((lck)->type == apr_anylock_none)         \
  68.       ? APR_SUCCESS                              \
  69.           : (((lck)->type == apr_anylock_procmutex)    \
  70.               ? apr_proc_mutex_lock((lck)->lock.pm)      \
  71.                       : APR_EINVAL))
  72.  
  73. #endif /* APR_HAS_THREADS */
  74.  
  75. #if APR_HAS_THREADS
  76.  
  77. /** Try to lock an apr_anylock_t structure */
  78. #define APR_ANYLOCK_TRYLOCK(lck)                \
  79.     (((lck)->type == apr_anylock_none)            \
  80.       ? APR_SUCCESS                                 \
  81.       : (((lck)->type == apr_anylock_threadmutex)     \
  82.           ? apr_thread_mutex_trylock((lck)->lock.tm)    \
  83.           : (((lck)->type == apr_anylock_procmutex)       \
  84.               ? apr_proc_mutex_trylock((lck)->lock.pm)      \
  85.               : (((lck)->type == apr_anylock_readlock)        \
  86.                   ? apr_thread_rwlock_tryrdlock((lck)->lock.rw) \
  87.                   : (((lck)->type == apr_anylock_writelock)       \
  88.                       ? apr_thread_rwlock_trywrlock((lck)->lock.rw) \
  89.                           : APR_EINVAL)))))
  90.  
  91. #else /* APR_HAS_THREADS */
  92.  
  93. #define APR_ANYLOCK_TRYLOCK(lck)                \
  94.     (((lck)->type == apr_anylock_none)            \
  95.       ? APR_SUCCESS                                 \
  96.           : (((lck)->type == apr_anylock_procmutex)       \
  97.               ? apr_proc_mutex_trylock((lck)->lock.pm)      \
  98.                           : APR_EINVAL))
  99.  
  100. #endif /* APR_HAS_THREADS */
  101.  
  102. #if APR_HAS_THREADS
  103.  
  104. /** Unlock an apr_anylock_t structure */
  105. #define APR_ANYLOCK_UNLOCK(lck)              \
  106.     (((lck)->type == apr_anylock_none)         \
  107.       ? APR_SUCCESS                              \
  108.       : (((lck)->type == apr_anylock_threadmutex)  \
  109.           ? apr_thread_mutex_unlock((lck)->lock.tm)  \
  110.           : (((lck)->type == apr_anylock_procmutex)    \
  111.               ? apr_proc_mutex_unlock((lck)->lock.pm)    \
  112.               : ((((lck)->type == apr_anylock_readlock) || \
  113.                   ((lck)->type == apr_anylock_writelock))    \
  114.                   ? apr_thread_rwlock_unlock((lck)->lock.rw)   \
  115.                       : APR_EINVAL))))
  116.  
  117. #else /* APR_HAS_THREADS */
  118.  
  119. #define APR_ANYLOCK_UNLOCK(lck)              \
  120.     (((lck)->type == apr_anylock_none)         \
  121.       ? APR_SUCCESS                              \
  122.           : (((lck)->type == apr_anylock_procmutex)    \
  123.               ? apr_proc_mutex_unlock((lck)->lock.pm)    \
  124.                       : APR_EINVAL))
  125.  
  126. #endif /* APR_HAS_THREADS */
  127.  
  128. #endif /* !APR_ANYLOCK_H */
  129.